/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package futbol.tacticas.concursantes.aitkiar.aitutil;

import futbol.tacticas.Comando;
import futbol.tacticas.SituacionJugadores;
import java.awt.Point;

/**
 *
 * @author aitkiar
 */
public abstract class Jugador
{

    protected int x;
    protected int y;
    protected int fuerza;
    protected int numero;
    protected Point posicion;
    protected Point puntoPase;
    protected int notificacionPase;
    protected Jugador[] equipo;
    protected Campo campo;
    protected boolean defensivo = false;    

    public Jugador( int x, int y, int fuerza, int numero )
    {
        this.x = x;
        this.y = y;
        this.fuerza = fuerza;
        this.numero = numero;
    }

    public int getX()
    {
        return x;
    }

    public void setX( int x )
    {
        this.x = x;
    }

    public int getY()
    {
        return y;
    }

    public void setY( int y )
    {
        this.y = y;
    }

    public int getFuerza()
    {
        return fuerza;
    }

    public void setFuerza( int fuerza )
    {
        this.fuerza = fuerza;
    }

    public void setEquipo( Jugador[] equipo )
    {
        this.equipo = equipo;
    }

    public void setCampo( Campo campo )
    {
        this.campo = campo;
    }

    public void setDefensivo ( boolean defensivo )
    {
        this.defensivo = defensivo;
    }
    
    public abstract Comando getComando( SituacionJugadores sj );

    protected int mejorDisparo( SituacionJugadores sj )
    {
        int y1 = 25;
        double m;
        double n;

        Point posicion = sj.getMisJugadores()[this.numero];
        if ( sj.getContrario()[0].y > 0 )
        {
            y1 = -25;
        }

        m = (y1 - posicion.y) / (160 - posicion.x);
        n = y1 - m * posicion.x;

        return (int) Math.round( 190 * m + n );

    }

    public void notificaPase( int fuerza, Point puntoPase )
    {
        notificacionPase = fuerza - 3;
        this.puntoPase = puntoPase;
    }

    /** Funcion genérica que obtiene la mejor zona de pase del campo y el punto dentro de la zona.
     * Calculamos la heurística del pase teniendo en cuenta el número de compañeros en las zonas 
     * adyacentes y el número de contrarios. Y luego sumamos la distancia en x para priorizar los pases
     *  ofensivos.
     */
    protected Point getPase( SituacionJugadores sj )
    {
        ZonaCampo[] zonasPase;
        ZonaCampo zonaPase;
        int mizona = campo.getZona( posicion );
        Point mejorPase = null;
        int heuristicaPase;
        int mejorHeuristica = -1000;

        zonasPase = campo.getZonasPase( mizona, Utils.getDistanciaDisparo( fuerza ) );
        for ( int i = 0; i < zonasPase.length; i++ )
        {
            zonaPase = zonasPase[i];
            heuristicaPase = getHeuristicaPaseContrarios( zonaPase );
            heuristicaPase += (zonaPase.pase.x - posicion.x);

            heuristicaPase += heuristicaPaseClase( sj, zonaPase );

            if ( heuristicaPase > mejorHeuristica )
            {
                mejorHeuristica = heuristicaPase;
                mejorPase = zonaPase.pase;
            }
        }
        return mejorPase;
    }

    protected int getHeuristicaPaseContrarios( ZonaCampo zonaPase )
    {
        int heuristicaPase = 0;
        ZonaCampo zona;
        ZonaCampo[] zonasAdyacentes = campo.getAdyacentes( zonaPase.pase );

        for ( int j = 0; j < zonasAdyacentes.length; j++ )
        {
            zona = zonasAdyacentes[j];
            heuristicaPase += zona.nJugadores - zona.nContrarios;
        }
        return heuristicaPase;
    }

    /** Consideramos el mejor desmarque el que nos mueve a una zona con menor número de 
     * jugadores y mayor x.
     *
     */
    protected Point getMejorDesmarque( SituacionJugadores sj )
    {
        ZonaCampo[] zonasDesmarque;
        ZonaCampo zonaDesmarque;
        int mizona = campo.getZona( posicion );
        Point mejorDesmarque = null;
        int heuristicaDesmarque;
        int mejorHeuristica = -1000;

        zonasDesmarque = campo.getAdyacentes( mizona );

        for ( int i = 0; i < zonasDesmarque.length; i++ )
        {
            zonaDesmarque = zonasDesmarque[i];
            heuristicaDesmarque = 0;
            heuristicaDesmarque += - zonaDesmarque.nContrarios * 5 - zonaDesmarque.nJugadores;
            heuristicaDesmarque += (zonaDesmarque.pase.x - posicion.x);
            heuristicaDesmarque += heuristicaDesmarqueClase( sj, zonaDesmarque );
            if ( heuristicaDesmarque > mejorHeuristica )
            {
                mejorHeuristica = heuristicaDesmarque;
                mejorDesmarque = zonaDesmarque.pase;
            }
        }

        return mejorDesmarque;
    }

    public abstract int heuristicaDesmarqueClase( SituacionJugadores sj, ZonaCampo zona );
    
    public abstract int heuristicaPaseClase( SituacionJugadores sj, ZonaCampo zona );
}
